/* 玩家 */
#ifndef __PLAYER_H__
#define __PLAYER_H__

#include "VirObj.h"
#include "Prop.h"
#include "FileTools.h"
#include "StdMyString.h"

class Player : public VirObj
{
public:
    // 构造（玩家名字）
    Player(CStrRef name);
    // 移动
    bool Move();
    // 升级
    void LevelUp();
    // 属性界面
    void AttrInterface();
    // 秀一下玩家
    void show();
    // 秀一下背包
    void showBag();
    // 返回背包容器
    std::vector<PropPtr> &GetBag() { return bag; }
    // 返回武器指针
    Weapon *GetW() { return w; }
    // 返回防具指针
    Armor *GetA() { return a; }
    // Medicine *GetM() { return m; } 

    DEFINE_MEMBER(MaxWidth, int);  // 宽边界
    DEFINE_MEMBER(MaxHeight, int); // 高边界
    DEFINE_MEMBER(Level, int);     // 等级
    DEFINE_MEMBER(AttrPoint, int); // 属性
    // 初始血量上限
    int MaxHP = 2000;

    // 塞入背包
    void InsertBag(const PropPtr &ptr);

    // 将玩家信息存入容器
    std::vector<std::string> GetPlayerInfo(int FloorFlag);
    // 将背包信息存入容器
    std::vector<std::string> GetBagInfo();
    // 写入玩家信息
    void WriteInPlayerInfo(std::string &fileName);
    // 写入背包信息
    void WriteInBagInfo(std::string &fileName);
    // 读取背包信息
    void ReadBagInfo(const std::string &fileName);

    // 删除存档
    void RemoveFile(const std::string &fileName);

private:
    // 背包容器（里面装的是商品指针）
    std::vector<PropPtr> bag;
    // 武器指针（用的是裸指针，指向容器的对象）
    Weapon *w;
    // 防具指针
    Armor *a;
    // 药水指针
    Medicine *m;

};


// 属性操作基类
class AttrOperation
{
public:
    virtual void Operation(Player& player, int number) = 0;
};

// 攻击属性加点
class AttackOperation : public AttrOperation 
{
public:
    void Operation(Player& player, int number) override
    {
        player.SetAttack(player.GetAttack() + number * 10);
    }
};

// 防御属性加点
class DefendOperation : public AttrOperation 
{
public:
    void Operation(Player& player, int number) override 
    {
        player.SetDefend(player.GetDefend() + number * 10);
    }
};

// 血量属性加点
class HPOperation : public AttrOperation 
{
public:
    void Operation(Player& player, int number) override 
    {
        player.MaxHP += number * 100;
    }
};

// 暴击属性加点
class PowerOperation : public AttrOperation 
{
public:
    void Operation(Player& player, int number) override 
    {
        // 暴击率加点（不超过80%）
        if (player.GetPower() + number > 80) 
        {
            number = 80 - player.GetPower();
        }
        player.SetPower(player.GetPower() + number);
    }
};

// 闪避属性加点
class DodgeOperation : public AttrOperation 
{
public:
    void Operation(Player& player, int number) override 
    {
        // 闪避率加点（不超过50%）
        if (player.GetDodge() + number > 50) 
        {
            number = 50 - player.GetDodge();
        }
        player.SetDodge(player.GetDodge() + number);
    }
};

// 工厂类
class AttrFactory 
{
public:
    // 根据传入的choice参数动态创建一个AttrOperation类型的对象，并返回一个指向该对象的智能指针
    static std::unique_ptr<AttrOperation> CreateOperation(int choice) 
    {
        switch (choice) 
        {
            case 1: 
                return std::make_unique<AttackOperation>();
            case 2: 
                return std::make_unique<DefendOperation>();
            case 3: 
                return std::make_unique<HPOperation>();
            case 4: 
                return std::make_unique<PowerOperation>();
            case 5: 
                return std::make_unique<DodgeOperation>();
            default: 
                return nullptr;
        }
    }
};


#endif
